// 1、interface和type区别
//  (1)、相同点:interface和type都可以用于定义对象结构，两者在许多场景中是可以互换的
//       不同点： 1、interface:更专注于定义对象和类的结构，支持继承、合并
//             2、type可以定义类型别名、联合类型、交叉类型，但不支持继承和自动合并

// 相同点案例

// 用interface定义obj对象
interface objinterface {
    name:string
    age:number,
    speak():void
}

// 使用type定义obj对象
type objType = {
    name:string
    age:number,
    speak():void
}

const objInter:objinterface = {
    name:'tom',
    age:18,
    speak(){
        console.log('我是tom今年18岁');
    }
}
const objtype:objType = {
    name:'tom',
    age:18,
    speak(){
        console.log('我是tom今年18岁');
    }
}

// 不同点案例
// interface合并与继承
interface infoMessage {
    name:string,
    age:number
}
interface infoMessage {
    speak:()=>void
}
interface pageInfo extends infoMessage{
    grade:string
}
const pageinfo:pageInfo = {
    name:'李四',
    age:18,
    grade:'幼儿园',
    speak() {
        console.log('我真是服了');
    },
}
// type 类型别名、联合类型、交叉类型   type想要实现interface的那种数据格式只能使用交叉类型继承
// 使用type定义deskType类型，并通过交叉类型实现属性的合并
type deskType = {
    name:string,
    age:number
}&{
    speak:()=>void
}
type deskAll = deskType & {
    grade:string
}


// 2、interface与抽象类的区别
// 相同点:都用于定义一个类的格式（应该遵循的契约）
// 不同点:
//     (1)、接口：只能描述结构，不能有任何实现代码，一个类可以实现多个接口
//     (2)、抽象类:既可以包含抽象方法，也可以包含具体方法，一个类只能继承一个抽象类

// 接口，一个类实现多个接口
//起飞接口 
interface FlyInterface {
    fly():void
}
// 游泳接口
interface SwimInterface {
    swim():void
}

// 鸭子类
class Duck implements FlyInterface,SwimInterface{
    fly():void{
        console.log('鸭子起飞喽');
    }
    swim(): void {
        console.log('鸭子可以游泳喽');
    }
}
const duck = new Duck()
duck.fly()
duck.swim()